首页 > 解决方案 > 具有 awk-last line 问题的行到列

问题描述

我有几个文件夹,每个文件夹都包含一个文本文件,我将在 Bash 中转置(将行转换为列)。我已经在 for 循环中使用 awk 进行了设置,但是我对最后一行有疑问,该行从未正确转置。

这是我的 input.txt

ID1 11208   13391   16070   19383
ID2 6691    8489    8723    7493
ID3 5768    6004    7754    7614

这是我的 output.txt 错误。

ID1 ID2 ID3
11208   6691    5768
13391   8489    6004
16070   8723    7754
19383       
7493    
7614    

这就是我要的

ID1 ID2 ID3
11208   6691    5768
13391   8489    6004
16070   8723    7754
19383   7493    7614

我的 awk 一个班轮是:

input.txt | awk '{for(i=1; i<=NF; i++) A[i]=A[i] (NR>1?OFS:x) $i} END{for(i=1; i<=NR; i++) print A[i]}' OFS="\t" > output.txt

提前感谢大家的时间

标签: awk

解决方案


以下awk可能会对您有所帮助。

awk '
!a[$1]++{
  val=val?val OFS $1:$1}
{
  for(i=2;i<=NF;i++){
    b[FNR,i]=$i}
}
END{
  print val;
  for(j=2;j<=NF;j++){
    for(k=1;k<=FNR;k++){
      printf("%s%s",b[k,j],k==FNR?ORS:OFS)}
}}
'   Input_file

编辑:感谢@jas 在这里指出这一点:

@OP:如果您有 DOS 结束行,请在此处检查:

cat -v Input_file

如果您看到控制 M 字符,请执行以下操作以删除它们。

tr -d '\r' < Input_file > temp_file && mv temp_file Input_file

推荐阅读