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

Bash 使用awk获取第1列和第3列并将它们合并为一个,bash,shell,awk,Bash,Shell,Awk,我有一个文本文件,其中包含我需要以以下形式提取的信息: code1 something1 code2 something2 code3 something3 code4 something4 code5 something5 code6 something6 ... 我想将其摘录成两份单独的文件,格式如下: code1 code2 code3 code4 ... 以及: 请注意,它们必须订购。例如使用cat mydocument | awk'{print$1$3}'输出 code1

我有一个文本文件,其中包含我需要以以下形式提取的信息:

 code1 something1 code2 something2 code3 something3
 code4 something4 code5 something5 code6 something6
 ...  
我想将其摘录成两份单独的文件,格式如下:

code1
code2
code3
code4
...
以及:

请注意,它们必须订购。例如使用
cat mydocument | awk'{print$1$3}'
输出

code1code2
code4code5
...

您可以多次使用
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

将第1、3、5、7列等写入code.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

awk'{for(i=1;i如果这不是您所需要的全部,那么请更新您的问题,以显示一些更具代表性的示例输入和预期输出

输入

$ 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
输出

$ 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
$awk'NF{for(i=1;i(i%2?.code.txt):“something.txt”)}'f
$cat code.txt
代码1
代码2
代码3
代码4
代码5
代码6
$cat something.txt
有些事
什么
有些事
有些事
什么
什么
试试这个-

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

您要求的是
awk
,其他解决方案也是可能的

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

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

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


如果这还不是你所需要的,那么编辑你的问题以使其更清晰。

你确定吗?我认为它应该输出代码1代码2;代码3代码4;…@giuseppe true,更正。将“代码”和“某物”的示例作为你的示例输入/输出,而不仅仅是这些单词,否则你可能会得到一个只适用于字面上包含“代码”的输入的解决方案“某物”或其他方式对于您的真实数据来说不是一个好的(或功能性的)解决方案。您的输入文件是否真的在每个数据行之间都有一个空行?如果没有,请修复您的问题,使其更真实地代表您的真实数据。感谢您共享这个漂亮的命令(您的awk命令的粉丝),虽然我的命令的逻辑与您类似,但老实说,我没有复制它:)(发布几分钟前)@Ed,根据本文()使用-v和内置变量可能会导致令人惊讶的结果,所以我认为
awk'BEGIN{RS=“[:space:]+”}{print>(NR%2?“foo”:“bar”)}“
可以是used@Vicky这篇文章是关于awk在执行时设置的变量(如NF和NR)的警告,而不是它从未设置过的变量(如RS、ORS、FS和OFS)。在命令行上设置变量没有错。使用
-v
时,您需要注意的唯一一点是它会如此解释转义序列<代码>\t
将成为文本制表符等,但在本例中不适用。
awk -v RS='[[:space:]]+' '{print > (NR%2?"foo":"bar")}' file