使用awk获取第1列和第3列并将它们合并为一个

时间:2017-02-26 16:34:34

标签: bash shell 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
...

7 个答案:

答案 0 :(得分:3)

将第1,3,5,7列等写入文件code.txt和第2,4,6,8列,依此类推文件.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

答案 1 :(得分:2)

鉴于您目前所发布的内容,您需要的是(使用GNU awk进行多字符RS):

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

如果您不是全部,那么请将问题编辑为更清楚。

答案 2 :(得分: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 :(得分: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

答案 4 :(得分: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

答案 5 :(得分:0)

@DIX:尝试:另一种不同的方法,没有循环等,也可以帮助你,我在考虑你的Input_file中没有空行。

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

答案 6 :(得分:0)

您要求awk,其他解决方案也可以。

当所有行都具有偶数nr个字段时,您可以执行

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

或使用sed

的相同想法
sed 's/ *\([^ ]\+\) [^ ]\+/\1\n/g' input.txt > oddfields.txt
sed 's/ *[^ ]\+ \([^ ]\+\)/\1\n/g' input.txt > evenfields.txt