如何在 Linux 中的 .txt 文件末尾添加一列?
How to add a column at the end of .txt file in Linux?
我想在 .txt 文件末尾的每一行中添加一个仅包含“2”作为值的新列,并将新文件另存为输出。我将 R 中的 input.txt 文件保存为制表符分隔文件。我试过以下代码;
awk -v RS='\r\n' 'BEGIN {OFS = '\t'} {print [=13=], "2"}' input.txt > output.txt
但它会将 2 作为附加值添加到最后一列,并且还会在 output.txt 文件中的每个数据行之后添加一个空白行
我的input.txt
SAMPLE rs1 rs2 rs3 rs4 rs5 rs6 rs7 rs8 rs9 rs10 rs11
6 0 0 0 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0 0 0 0
10 1 1
14 0 0 0 0 0 0 0 0 0 0 0
19 0 0 0 0 0 0 0 0 0 0 0
34 0 0 0 0 0 0 0 0 0 0 0
40 1 1 1
41 0 0 0 0 0 0 0 0 0 0 0
46 1
58 1
67 0 0 0 0 0 0 0 0 0 0
69 1
71 0 0 0 0 0 0 0 0 0 0 0
76 0 0 0 0 0 0 0 0 0 0 0
78 0 0 0 0 0 0 0 0 0 0 0
80 1
83 0 0 0 0 0 0 0 0 0 0
84 1
86 1
90 1
92 0 0 0 0 0 0 0 0 0 0
94 0 0 0 0 0 0 0 0 0 0
95 0 0 0 0 0 0 0 0 0 0
我得到的是 output.txt 使用上面的代码;
SAMPLE rs1 rs2 rs3 rs4 rs5 rs6 rs7 rs8 rs9 rs10 rs112
6 0 0 0 0 0 0 0 0 0 0 02
7 0 0 0 0 0 0 0 0 0 0 02
10 1 1 2
14 0 0 0 0 0 0 0 0 0 0 02
19 0 0 0 0 0 0 0 0 0 0 02
34 0 0 0 0 0 0 0 0 0 0 02
40 1 1 12
41 0 0 0 0 0 0 0 0 0 0 02
46 1 2
58 1 2
67 0 0 0 0 0 0 0 0 0 02
69 1 2
71 0 0 0 0 0 0 0 0 0 0 02
76 0 0 0 0 0 0 0 0 0 0 02
78 0 0 0 0 0 0 0 0 0 0 02
80 1 2
83 0 0 0 0 0 0 0 0 0 02
84 1 2
86 1 2
90 1 2
92 0 0 0 0 0 0 0 0 0 02
94 0 0 0 0 0 0 0 0 0 02
95 0 0 0 0 0 0 0 0 0 02
如何在末尾添加一列2?另外,有没有办法在 output.txt 文件的这一列中添加一个 header(例如,额外的)?
尝试
$ awk -v RS='\r\n' 'BEGIN{FS=OFS="\t"} {print [=10=], (NR==1?"header":2)}' input.txt > output.txt
您似乎需要 sed:
$ t=$(printf '\t')
$ sed -e '1s/$/'"${t}header/" -e '1!s/$/'"${t}2/" input > output
我猜你没有使用 GNU awk,所以 RS='\r\n'
被当作 RS='\r'
处理,因此将换行符作为下一条记录的一部分。此外,脚本中的 'BEGIN {OFS = '\t'} ... '
会将 OFS
设置为空字符串,因为它会尝试使用名为 t
的未初始化 awk 变量的内容 - 计算 '
s 以查看 \t
在 awk 程序之外。
试试这个:
awk 'BEGIN{OFS="\t"} {sub(/\r$/,""); print [=10=], (NR>1 ? 2 : "header")}' input.txt > output.txt
无论您的行以 \r\n
结尾还是仅以 \n
.
结尾,以上内容都可以在每个 UNIX 系统上使用任何 shell 中的任何 awk
我想在 .txt 文件末尾的每一行中添加一个仅包含“2”作为值的新列,并将新文件另存为输出。我将 R 中的 input.txt 文件保存为制表符分隔文件。我试过以下代码;
awk -v RS='\r\n' 'BEGIN {OFS = '\t'} {print [=13=], "2"}' input.txt > output.txt
但它会将 2 作为附加值添加到最后一列,并且还会在 output.txt 文件中的每个数据行之后添加一个空白行
我的input.txt
SAMPLE rs1 rs2 rs3 rs4 rs5 rs6 rs7 rs8 rs9 rs10 rs11
6 0 0 0 0 0 0 0 0 0 0 0
7 0 0 0 0 0 0 0 0 0 0 0
10 1 1
14 0 0 0 0 0 0 0 0 0 0 0
19 0 0 0 0 0 0 0 0 0 0 0
34 0 0 0 0 0 0 0 0 0 0 0
40 1 1 1
41 0 0 0 0 0 0 0 0 0 0 0
46 1
58 1
67 0 0 0 0 0 0 0 0 0 0
69 1
71 0 0 0 0 0 0 0 0 0 0 0
76 0 0 0 0 0 0 0 0 0 0 0
78 0 0 0 0 0 0 0 0 0 0 0
80 1
83 0 0 0 0 0 0 0 0 0 0
84 1
86 1
90 1
92 0 0 0 0 0 0 0 0 0 0
94 0 0 0 0 0 0 0 0 0 0
95 0 0 0 0 0 0 0 0 0 0
我得到的是 output.txt 使用上面的代码;
SAMPLE rs1 rs2 rs3 rs4 rs5 rs6 rs7 rs8 rs9 rs10 rs112
6 0 0 0 0 0 0 0 0 0 0 02
7 0 0 0 0 0 0 0 0 0 0 02
10 1 1 2
14 0 0 0 0 0 0 0 0 0 0 02
19 0 0 0 0 0 0 0 0 0 0 02
34 0 0 0 0 0 0 0 0 0 0 02
40 1 1 12
41 0 0 0 0 0 0 0 0 0 0 02
46 1 2
58 1 2
67 0 0 0 0 0 0 0 0 0 02
69 1 2
71 0 0 0 0 0 0 0 0 0 0 02
76 0 0 0 0 0 0 0 0 0 0 02
78 0 0 0 0 0 0 0 0 0 0 02
80 1 2
83 0 0 0 0 0 0 0 0 0 02
84 1 2
86 1 2
90 1 2
92 0 0 0 0 0 0 0 0 0 02
94 0 0 0 0 0 0 0 0 0 02
95 0 0 0 0 0 0 0 0 0 02
如何在末尾添加一列2?另外,有没有办法在 output.txt 文件的这一列中添加一个 header(例如,额外的)?
尝试
$ awk -v RS='\r\n' 'BEGIN{FS=OFS="\t"} {print [=10=], (NR==1?"header":2)}' input.txt > output.txt
您似乎需要 sed:
$ t=$(printf '\t')
$ sed -e '1s/$/'"${t}header/" -e '1!s/$/'"${t}2/" input > output
我猜你没有使用 GNU awk,所以 RS='\r\n'
被当作 RS='\r'
处理,因此将换行符作为下一条记录的一部分。此外,脚本中的 'BEGIN {OFS = '\t'} ... '
会将 OFS
设置为空字符串,因为它会尝试使用名为 t
的未初始化 awk 变量的内容 - 计算 '
s 以查看 \t
在 awk 程序之外。
试试这个:
awk 'BEGIN{OFS="\t"} {sub(/\r$/,""); print [=10=], (NR>1 ? 2 : "header")}' input.txt > output.txt
无论您的行以 \r\n
结尾还是仅以 \n
.