2017-02-26 21 views
-1

我有一个包含我需要在下面的表格中提取信息的文本文件:获取列1和3使用awk,并将它们合并成一个

code1 something1 code2 something2 code3 something3 
code4 something4 code5 something5 code6 something6 
... 

而且我想提取到两个单独的文件形式:

code1 
code2 
code3 
code4 
... 

和:

something1 
something2 
something3 
something4 
... 

注意,它们必须是有序的。例如使用cat mydocument | awk '{print $1 $3}'输出

code1code2 
code4code5 
... 
+0

你确定吗?我认为它应该输出code1 code2;代码3代码4; ... – giuseppe

+0

@giuseppe真实,更正。 – D1X

+2

将“code”和“something”作为示例输入/输出的示例,而不仅仅是那些单词,或者您最终可能会得到一个解决方案,该解决方案仅适用于字面上包含“code”和“something”的输入或其他对于您的真实数据,方法并不是一个好的(或功能性的)解决方案。你的输入文件在每条数据线之间是否真的有空行?如果不是,请解决您的问题,以更真实地代表您的真实数据。 –

回答

0

您可以在单独的行使用print多次输出所有相关领域:

awk '{print $1; print $3; print $5}' input_file > fields1_3_and_5 
awk '{print $2; print $4; print $6}' input_file > fields2_4_and_6 

如果空行出现在你的输入文件为您的文章似乎表明,你可以检查字段的数量,以避免让他们在你的输出文件:

awk 'NF==6{print $1; print $3; print $5}' input_file > fields1_3_and_5 
awk 'NF==6{print $2; print $4; print $6}' input_file > fields2_4_and_6 
3

写入列1,3,5,7等文件代码.TXT等列2,4,6,8和something.txt文件:

awk '{for (i=1; i<=NF; i=i+2) print $i}' input.txt > code.txt 
awk '{for (i=2; i<=NF; i=i+2) print $i}' input.txt > something.txt 
0

如果这不是你所需要的,然后更新您的问题表现出一些更多的真正具有代表性的样本输入和预期的输出。

输入

$ cat f 
code1 something1 code2 something2 code3 something3 

code4 something4 code5 something5 code6 something6 

输出

$ awk 'NF{for(i=1; i<=NF; i++)print $i >(i%2?"code.txt":"something.txt")}' f 

$ cat code.txt 
code1 
code2 
code3 
code4 
code5 
code6 

$ cat something.txt 
something1 
something2 
something3 
something4 
something5 
something6 
0

试试这个 -

awk '{for (i=1; i<=NF;i++) if(i%2!=0) {print $i > "code.txt"} else{print $i > "col.txt"}}' column.txt 

在这里你可以看到两者的输出文件 -

paste code.txt col.txt 
code1 something1 
code2 something2 
code3 something3 
code4 something4 
code5 something5 
code6 something6 
0

@DIX:尝试:还有一个不同的方法,没有循环等,可以帮助你,我考虑到没有空行有没有在你的INPUT_FILE。

awk '{print > (NR%2==0?"even_file_output":"odd_file_output")}' RS='[ |\n]' Input_file 
0

您要求提供awk,其他解决方案也是可行的。

当所有的线路有一个甚至NR字段,你可以使用sed

sed 's/ *\([^ ]\+\) [^ ]\+/\1\n/g' input.txt > oddfields.txt 
sed 's/ *[^ ]\+ \([^ ]\+\)/\1\n/g' input.txt > evenfields.txt 
2

鉴于您已发布的信息,到目前为止,所有你需要做的是

grep -Eo "[^ ]+ [^ ]+" input.txt | cut -d" " -f1 > oddfields.txt 
grep -Eo "[^ ]+ [^ ]+" input.txt | cut -d" " -f2 > evenfields.txt 

或同样的想法(与GNU awk多字符RS):

awk -v RS='[[:space:]]+' '{print > (NR%2?"foo":"bar")}' file 

如果这并非所有你需要然后编辑你的问题是清晰。

+1

谢谢你分享这个漂亮的命令(你的awk命令的FAN),虽然我的命令的逻辑与你类似,但老实说我没有复制它:)(在发布之前的几分钟内) – RavinderSingh13

+0

@Ed,根据这篇文章https://www.gnu.org/software/gawk/manual/html_node/Options.html#Options)使用-v与内置变量可能会导致令人惊讶的结果,所以我认为'awk'BEGIN {RS =“[[ :space:]] + {} {print>(NR%2?“foo”:“bar”)}''可以使用 – Vicky

+0

@Vicky该文章警告awk在执行时设置的变量如NF和NR,不是那些从未像RS,ORS,FS和OFS那样设置的人。在命令行中设置变量没有任何问题。在使用'-v'时唯一需要注意的是它会解释转义序列,所以'\ t'将成为一个字面制表符等,但这不适用于这种情况。 –

相关问题